package io.tec.cloud.algorithm;

import java.util.Arrays;

public class AlgorithmUtil {

    /**
     * 判断两个数组是否相等
     *
     * @param arr1
     * @param arr2
     * @return
     */
    public static boolean isEquals(int[] arr1, int[] arr2) {
        if (arr1 == null && arr2 == null) return true;
        if (arr1 == null && arr2 != null) return false;
        if (arr1 != null && arr2 == null) return false;
        if (arr1.length != arr2.length) return false;
        for (int c = 0; c < arr1.length; c++) {
            if (arr1[c] != arr2[c]) {
                return false;
            }
        }
        return true;
    }

    /**
     * 调用api排序
     *
     * @param arr
     */
    private static void apiSort(int[] arr) {
        Arrays.sort(arr);
    }

    /**
     * 调用api复制数组
     *
     * @param arr
     * @return
     */
    public static int[] copyArray(int[] arr) {
        return Arrays.copyOf(arr, arr.length);
    }

    /**
     * 生成最大值为maxInt，长度为length的随机数组
     *
     * @param maxInt
     * @param length
     * @return
     */
    public static int[] generateArray(int maxInt, int length) {
        int[] arr = new int[length];
        for (int c = 0; c < length; c++) {
            // TODO 1~maxInt，，避免(int)Math.random() 为0的情况
            arr[c] = ((int) (Math.random() * maxInt)) + 1;
        }
        return arr;
    }

    /**
     * 循环打印array
     *
     * @param arr
     */
    public static <T> void printArray(T[] arr) {
        for (T i : arr) {
            System.out.print(i + ",");
        }
        System.out.println();
    }

    public static void printArray(int[] arr) {
        for (int i : arr) {
            System.out.print(i + ", ");
        }
        System.out.println();
    }

    /**
     * 借助第三个变量，交换数组两个索引上的值，额外空间复杂度为O(1)
     *
     * @param arr
     * @param i
     * @param j
     */
    public static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }

    /**
     * 通过异或，交换数组的两个索引上的值
     * <p>
     * 注意；i != j ，若相等，则会导致arr[i]为0。
     * a[i] = a[j]时，不影响使用。
     *
     * @param arr
     * @param i
     * @param j
     */
    public static void swapEOR(int[] arr, int i, int j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

    public static void sortArray(int[] compareArray) {
        Arrays.sort(compareArray);
    }

    public static int randomWithoutTarget(int maxValue) {
        return (int) (Math.random() * maxValue);
    }

    public static int random(int maxValue) {
        return (int) (Math.random() * maxValue) + 1;
    }

    public static int[] generateRandomArray(int maxValue, int maxSize) {
        int size = randomWithoutTarget(maxSize);
        int[] arr = new int[size];
        for (int i = 0; i < size; i++) {
            arr[i] = random(maxValue);
        }
        return arr;
    }

//    public static boolean compareArray(int[] arr, int[] compareArray) {
//        if (arr == null && compareArray != null) {
//            return false;
//        }
//
//        if (arr != null && compareArray == null) {
//            return false;
//        }
//
//        if (arr == null && compareArray == null) {
//            return true;
//        }
//
//        if (arr.length != compareArray.length) {
//            return false;
//        }
//
//        for (int i = 0; i < arr.length; i++) {
//            if (arr[i] != compareArray[i]) {
//                return false;
//            }
//        }
//        return true;
//    }
}
